package com.gz.furnitures.entity;

import com.gz.furnitures.dao.impl.FurnDaoImpl;

import java.math.BigDecimal;
import java.util.*;

public class Cart {
    private FurnDaoImpl furnDao = new FurnDaoImpl();
    //为保证购物车物品顺序和添加顺序一致，这里用LinkedHashMap，注意HashMap顺序可能会不同
    //                id    ,  家具
    private LinkedHashMap<Integer, CartItem> items = new LinkedHashMap<>();

    private int itemType=0;
    private BigDecimal pageTotalPrice=new BigDecimal(0);

    public BigDecimal getPageTotalPrice() {
        return pageTotalPrice;
    }

    public void setPageTotalPrice(BigDecimal pageTotalPrice) {
        this.pageTotalPrice = pageTotalPrice;
    }

    public int getItemType() {
        return itemType;
    }

    public void setItemType(int itemType) {
        this.itemType = itemType;
    }


    public LinkedHashMap<Integer, CartItem> getItems() {
        return items;
    }

    public void clear() {
        //清空购物车
        items.clear();
        itemType=0;
        pageTotalPrice=new BigDecimal(0);
    }

    public void deleteItem(int id){
        pageTotalPrice=new BigDecimal(0);
        items.remove(id);
        itemType--;
        Set<Integer> keySet = items.keySet();
        for (Integer key : keySet) {
            pageTotalPrice=pageTotalPrice.add(items.get(key).getTotalPrice());
        }
    }

    public void updateCount(int id,int count) {
        pageTotalPrice=new BigDecimal(0);
        CartItem item = items.get(id);
        if(item!=null) { //即id不为0的情况
            item.setCount(count);
            item.setTotalPrice(item.getPrice().multiply(new BigDecimal(count)));
            Set<Integer> keySet = items.keySet();
            for (Integer key : keySet) {
                pageTotalPrice=pageTotalPrice.add(items.get(key).getTotalPrice());
            }
        }
    }

    //前端中el的session
//    private Integer totalCount=0;
    public boolean addItem(CartItem cartItem){
        CartItem item = items.get(cartItem.getId());
        if(item==null){
            items.put(cartItem.getId(),cartItem);
            itemType++;
        }else {
            if (item.getCount()+1>furnDao.queryFurnById(item.getId()).getStock()){
                return false;
            }
            item.setCount(item.getCount()+1);
            //price -> BigDecimal
            //count -> Integer
            item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));
        }
        //千万不要直接写成pageTotalPrice.add(cartItem.getPrice());，要再赋给它才行

            pageTotalPrice = pageTotalPrice.add(cartItem.getPrice());
        return true;
    }

    public int getTotalCount(){
        //注意前端调用cart.totalcount就是调用getTotalCount，这是el特性
        //例如{book.name}相当于book.getName()
        int totalCount=0;
        Set<Integer> keys = items.keySet();
        //iter
        for (Integer id : keys) {
            totalCount+=((CartItem)items.get(id)).getCount();
        }
        return totalCount;
    }


//    //显示当前页[显示第几页]
//    private Integer pageNo;
//    //表示每页显示几条数据
//    private Integer pageSize=DEFAULT_PAGE_SIZE;
//    //表示共有多少页
//    private Integer pageTotalCount;
//    //可以通过totalRow和pageSize计算得到pageTotalCount
//    //表示共有多少条记录   (从数据库来的，交给Dao)
//    private Integer totalRow;
//    //表示当前页要显示的数据  (从数据库来的，交给Dao)
//    private List<T> items;
//    //分页导航的字符串
//    private String url;
    public Page<CartItem> getCartPage(int pageNo, int pageSize){
        Page<CartItem> cartItemPage = new Page<>();
        LinkedHashMap <Integer,CartItem> cartItems=new LinkedHashMap <>();
        cartItemPage.setPageNo(pageNo);
        cartItemPage.setPageSize(pageSize);
        cartItemPage.setTotalRow(getTotalCount());
        int pageTotalCount=itemType/pageSize;
        if(itemType%pageSize>0){
            pageTotalCount++;
        }
        cartItemPage.setPageTotalCount(pageTotalCount);
        int begin=(pageNo-1)*pageSize;

        List<Integer> keysAsList = new ArrayList<>(items.keySet());
        int end = Math.min(begin + pageSize, keysAsList.size());
        for(int i = begin; i < end; i++) {
            Integer key = keysAsList.get(i);
            cartItems.put(key, items.get(key));
        }
        cartItemPage.setCartItems(cartItems);
        return cartItemPage;
    }
}
